package com.monai.aidati.mq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;

import java.nio.charset.StandardCharsets;

public class SingleConsumer {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception{
        // 创建一个 ConnectionFactory 对象，用于创建与消息代理的连接
        ConnectionFactory factory = new ConnectionFactory();
        // 设置消息代理的主机地址为 localhost
        factory.setHost("localhost");
        factory.setUsername("admin");
        factory.setPassword("admin");
        // 通过 ConnectionFactory 创建一个新的连接
        Connection connection = factory.newConnection();
        // 通过连接创建一个通道，通道是执行大多数 API 的地方，例如声明队列、发布消息、消费消息等
        Channel channel = connection.createChannel();
        // 声明一个队列，使用 queueDeclare 方法
        // 参数说明：
        // QUEUE_NAME：队列的名称
        // false：表示该队列是否持久化，false 表示不持久化，即如果 RabbitMQ 服务重启，该队列将被删除
        // false：表示该队列是否排他性，false 表示不排他，多个消费者可以连接到该队列
        // false：表示该队列是否自动删除，false 表示不会自动删除，即使没有消费者，该队列也会保留
        // null：表示该队列的其他属性，这里设置为 null 表示没有额外的属性
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        // 输出等待消息的信息，提示用户按 CTRL+C 退出
        System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
        // 定义一个 DeliverCallback 对象，用于处理接收到的消息
        DeliverCallback deliverCallback=(consumerTag, delivery)->{
            // 将接收到的消息体(byte[] 类型)转换为 UTF-8 编码的字符串
            String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
            // 打印接收到的消息
            System.out.println(" [x] Received '" + message + "'");
        };
        // 开始消费消息，会持续阻塞等待消息
        // 参数说明：
        // QUEUE_NAME：要消费的队列名称
        // true：表示是否自动确认消息，true 表示一旦消息被发送给消费者，RabbitMQ 就会将其标记为已确认并从队列中删除
        // deliverCallback：处理接收到消息的回调函数
        // consumerTag -> { }：取消消费的回调函数，这里是一个空的实现
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
    }
}
